/**
 * 给定X和Y以及数组问满足条件的对数：
 * 1. Ai + Aj 是 X 的倍数
 * 2. Ai - Aj 是 Y 的倍数
 * 考虑同模关系即可，令 Y[i] 记录模Y为i的数构成的数组
 * 则只需要在Y[i]中查找和是X的倍数的即可
 * 同样令X[i]是模X为i的数的数量，只需要检查X[i]和X[X-i]即可
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;
using vpii = vector<pii>;

int N;
int X;
int Y;
vi A;

llt proc(const vi & vec){
    map<int, int> cnt;
    for(auto i : vec){
        ++cnt[i % X];
    }
    llt ans = 0;
    for(const auto & p : cnt){
        int left = (X - p.first) % X;

        if(p.first == left){
            ans += (p.second - 1LL) * p.second;
        }else{
            auto it = cnt.find(left);
            if(it != cnt.end()){
                ans += (llt)p.second * it->second;
            }
        }
    }
    ans >>= 1;
    return ans;
}

llt proc(){
    map<int, vi> mm;
    for(auto i : A){
        mm[i % Y].emplace_back(i);
    }

    llt ans = 0;
    for(const auto & p : mm){
        ans += proc(p.second);
    }
    return ans;
}

void work(){
    cin >> N >> X >> Y;
    A.assign(N, {});
    for(auto & i : A) cin >> i;
    cout << (proc()) << "\n";     
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int nofkase = 1;
	cin >> nofkase;
	while(nofkase--){	
        work();
	}
    return 0;
}